// 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。

function averageOfLevels(root: TreeNode | null): number[] {
    // 安全检测
    if (root == null) {
        return [];
    }
    const res: number[] = [];// 结果数组
    const queue: TreeNode[] = [root];// 队列
    while (queue.length > 0) {
        let currLen: number = queue.length;
        let sum: number = 0;
        for (let i = 0; i < currLen; i++) {
            let currNode: TreeNode = queue.shift()!;//  拿到当前节点
            sum += currNode.val
            // 添加左右节点
            if (currNode.left != null) queue.push(currNode.left);
            if (currNode.right != null) queue.push(currNode.right);
        }
        // 计算平均值并加入结果数组
        res.push(sum / currLen);
    }
    return res;
};


// 这道题目也是一道非常基础的广度优先遍历的题
// 我们首先使用队列来模拟广度优先遍历
// 在每一层的遍历中，初始化一个总和为0，依次取出当前层的节点做和
// 在遍历完当前的层节点后，用层节点数组的长度与总和作商得到结果
// 加入结果数组，BFS完整棵树后即可得到结果。